package com.intellagric.agriecom.service.recommend.service;


import com.intellagric.agriecom.module.recommend.RecommendModelServiceIN;
import com.intellagric.agriecom.service.recommend.cache.RedisHandler;
import com.intellagric.mapper.RecommendTemplateMapper;
import com.intellagric.pojo.RecommendTemplate;
import com.intellagric.pojo.RecommendTemplateExample;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * @Auther: zhy
 * @Date: 2019/5/9
 * @Description: 推荐模型服务
 */
@Service
public class RecommendModelService implements RecommendModelServiceIN {

    @Autowired
    private RecommendTemplateMapper recommendTemplateMapper;


    /**
     * 查询基于用户的协同过滤产生的推荐结果:
     *      一个人的推荐结果存放在Hash数据结构中(redis)
     *      field等于模型的标志
     *      value等于模型给该用户推荐的结果
     *
     * @param userId    用户id
     * @param needNum   推荐商品数量
     * @return List<String>
     */
    public List<String> recommendByUserCF(String userId, int needNum) {
        List<String> list = getProductIdListByCache("recom:" + userId, "UserCF");
        //取出推荐其中规定的数量
        return list.size() > needNum ? list.subList(0, needNum) : list;
    }

    /**
     * 查询基于物品的协同过滤产生的推荐结果:
     *
     * @param userId    用户id
     * @param needNum   推荐商品数量
     * @return List<String>
     */
    public List<String> recommendByItemCF(String userId, int needNum) {
        List<String> list = getProductIdListByCache("recom:" + userId, "ItemCF");
        return list.size() > needNum ? list.subList(0, needNum) : list;
    }

    /**
     * 查询默认的推荐结果
     *
     * @param adId    栏目id
     * @return List<String>
     */
    public List<String> defaultRecommend(int adId) {
        RecommendTemplateExample recommendTemplateExample = new RecommendTemplateExample();
        recommendTemplateExample.createCriteria().andColumnIdEqualTo(adId);
        List<RecommendTemplate> recommendTemplates = recommendTemplateMapper.selectByExample(recommendTemplateExample);
        String defaultProducts;
        List<String> defaultProductIdList = new ArrayList<>();
        if (recommendTemplates.size() > 0 ) {
            defaultProducts = recommendTemplates.get(0).getDefaultProducts();
            defaultProductIdList = getProductIdListByDefault(defaultProducts);
        }
        return defaultProductIdList;
    }


    /**
     * 从Redis中获取推荐的商品信息，封装商品id列表
     *
     * @param key
     * @param field
     * @return List<String>
     */
    private List<String> getProductIdListByCache(String key, String field) {
        List<String> list = new ArrayList<>();
        String recommends = RedisHandler.getValueByHashField(key, field);
        if (StringUtils.isNotBlank(recommends)) {
            String[] items = recommends.split(",");
            for (String item : items) {
                if (item.contains(":")) {
                    list.add(item.substring(0, item.indexOf(":")));
                } else {
                    list.add(item);
                }
            }
        }
        return list;
    }

    /**
     * 从默认的推荐商品id串中获取商品id数组
     *
     * @param defaultProductIds
     * @return List<String>
     */
    private List<String> getProductIdListByDefault(String defaultProductIds) {
        List<String> list = new ArrayList<>();
        if (StringUtils.isNotBlank(defaultProductIds)) {
            String[] productIds = defaultProductIds.split(",");
            for (String item : productIds) {
                list.add(item);
            }
        }
        return list;
    }

}
